iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
自我挑戰組

MCU功能介紹與實作系列 第 10

Day 10: MCU 語言:C、C++、組合語言

  • 分享至 

  • xImage
  •  

撰寫MCU時常見的語言包括C、C++和組合語言。本文將介紹這三種語言,並以控制LED閃爍的範例簡單做介紹。

C 語言

C語言是嵌入式系統開發中最廣泛使用的語言之一。它具有以下特點:

  • 簡潔而有效的語法。
  • 良好的可移植性,適用於不同型號的MCU。
  • 強大的庫支援,有豐富的函式庫可供使用。
  • 高效的記憶體管理和控制。

以下是一個使用C語言的LED閃爍示例程式碼,假設LED位於MCU PD2腳位:

#include <avr/io.h>
#include <util/delay.h>

// 定義LED接在PD2
#define LED_PIN  PD2

int main(void) {
    // 設定PD2腳位為輸出端
    DDRD |= (1 << LED_PIN);

    while (1) {
        // 開啟LED
        PORTD |= (1 << LED_PIN);

        // 延遲
        _delay_ms(1000);

        // 關閉LED
        PORTD &= ~(1 << LED_PIN);

        // 延遲
        _delay_ms(1000);
    }

    return 0;
}

C++ 語言

C++是一種基於C語言的擴展,它具有物件導向編程的特點。在MCU開發中,C++的使用不如C普遍,但仍然有其優勢:

物件導向的設計,使程式碼更模組化和可維護。
支援類、繼承和多態等面向對象的概念。
有些MCU開發工具支援C++。
以下是一個使用C++語言的LED閃爍示例程式碼:

#include <iostream>
#include <thread>
#include <chrono>

// 定義MCU腳位控制LED的類別
class LED {
public:
    void control(bool state) {
        // 在這裡寫LED控制的程式碼
    }
};

int main() {
    LED led;

    while (true) {
        // 開啟LED
        led.control(true);

        // 延遲500毫秒
        std::this_thread::sleep_for(std::chrono::milliseconds(500));

        // 關閉LED
        led.control(false);

        // 延遲500毫秒
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }

    return 0;
}

組合語言

組合語言是一種低階語言,直接操作MCU的指令和寄存器。它具有以下特點:

極高的控制和效能,適用於對資源要求嚴格的應用。
學習曲線較陡峭,需要深入了解MCU的體系結構。

以下是一個簡單的AVR組合語言示例,用於控制LED的閃爍。請注意,實際的組合語言程式碼將根據具體的AVR型號和硬體設置而有所不同,以下僅為示例:

.include "m328pdef.inc"  ; 包含AVR ATmega328P的設定

; 定義LED腳位
.equ LED_PORT = PORTB    ; LED連接到PORTB
.equ LED_DDR = DDRB      ; LED的DDR設定

; 定義延遲計數
.equ DELAY_COUNT = 10000

.global main
main:
    ; 初始化設定
    ldi r16, 0xFF        ; 將R16設為0xFF,用於設定所有PORTB腳位為輸出
    out DDRB, r16        ; 設定PORTB為輸出

loop:
    ; 開啟LED
    sbi LED_PORT, 0      ; 將PORTB的第0個引腳設為高電位

    ; 延遲
    ldi r17, DELAY_COUNT
delay_on:
    dec r17
    brne delay_on

    ; 關閉LED
    cbi LED_PORT, 0      ; 將PORTB的第0個引腳設為低電位

    ; 延遲
    ldi r17, DELAY_COUNT
delay_off:
    dec r17
    brne delay_off

    ; 無窮迴圈
    rjmp loop

.end

C語言在MCU開發中是最常見和廣泛使用的,它提供了良好的可移植性和效能。C++則在需要物件導向設計的應用中有一定的優勢。組合語言通常在對效能要求極高的應用中使用。以下為三者間的比較:

特徵 C 語言 C++ 語言 組合語言
適用領域 通用性強,廣泛應用於軟體開發 物件導向語言,適用於複雜系統 低階硬體控制,最接近機器
語法複雜性 相對較簡單 相對複雜 高度特定
性能 中等 中等到高
記憶體使用 中等 中等到高
物件導向程式設計 不支援 支援 不支援
資源管理 手動 自動 手動
跨平台性 通用,跨平台性良好 通用,跨平台性良好 依賴於目標平台
程式庫框架的支援 許多C的函式庫和框架可用 許多C++函式庫和框架可用 有限
開發速度 相對快速 相對快速 相對較慢
錯誤處理和debug 較簡單,相對容易debug 複雜,debug較具挑戰性 複雜,需要細致的debug技巧

上一篇
Day 9: MCU coding環境的選擇
下一篇
Day 11: 開發工具:IDE、編譯器、模擬器
系列文
MCU功能介紹與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言